#include "snake.h"

// 全局变量定义
bool s_key_down = false;
bool ctrl_b_pressed = false;
bool ctrl_e_pressed = false;

// 清除蛇的显示
void clearSnake()
{
  for (int i = 0; i < snakeLength; i++)
  {
    mvprintw(snake[i].y, snake[i].x, " ");
  }
}

// 判断蛇是否咬到自己
int biteself()
{
  for (int i = 1; i < snakeLength; i++)
  {
    if (snake[0].x == snake[i].x && snake[0].y == snake[i].y)
    {
      return 1; // 咬到自己
    }
  }
  return 0;
}

// 判断蛇是否撞到墙
int cantcrosswall()
{
  // 与 createMap() 的边界一致
  if (snake[0].x <= 0 || snake[0].x >= maxX - 1 || snake[0].y <= 0 || snake[0].y >= maxY - 4)
  {
    return 1; // 撞到墙
  }
  return 0;
}

// 设置蛇加速前进
void speedup()
{
  if (delay > 20) // 最小延迟 20ms
  {
    delay -= 70; // 增大加速幅度
  }
}

// 设置蛇减速前进
void speeddown()
{
  if (delay < 700) // 最大延迟 700ms
  {
    delay += 100; // 增大减速幅度
  }
}

// 恢复初始速度（^e 效果）
void resetSpeed()
{
  delay = 200;
}

// 蛇自动移动
void snakemove()
{
  if (!isMoving)
    return; // 如果未启动移动，直接返回

  // 保存当前蛇尾位置，用于增长
  int tailX = snake[snakeLength - 1].x;
  int tailY = snake[snakeLength - 1].y;

  // 计算新蛇头位置
  int newX = snake[0].x;
  int newY = snake[0].y;
  switch (direction)
  {
  case KEY_UP:
    newY--;
    break;
  case KEY_DOWN:
    newY++;
    break;
  case KEY_LEFT:
    newX--;
    break;
  case KEY_RIGHT:
    newX++;
    break;
  }

  // 先清除旧蛇的位置
  clearSnake();
  // 清除旧食物位置
  mvprintw(foodY, foodX, " ");

  // 检查是否吃到食物
  bool ateFood = (newX == foodX && newY == foodY);
  if (ateFood)
  {
    // 直接在末尾补一个 *
    snake[snakeLength].x = tailX;
    snake[snakeLength].y = tailY;
    snakeLength++;
    // 根据按键状态调整得分
    if (s_key_down)
    {
      currScore += 1; // 按住 s 吃食物得 1 分
    }
    else
    {
      currScore += 2; // 正常或加速时得 2 分
    }
    if (delay > 20)
      delay -= 30; // 吃食物后加速
    createfood();
  }
  else
  {
    // 移动蛇身
    for (int i = snakeLength - 1; i > 0; i--)
    {
      snake[i] = snake[i - 1];
    }
  }
  // 更新蛇头位置
  snake[0].x = newX;
  snake[0].y = newY;

  // 绘制蛇身（从尾部到第二段）
  attron(COLOR_PAIR(2));
  for (int i = 1; i < snakeLength; i++)
  {
    mvprintw(snake[i].y, snake[i].x, "*");
  }
  // 绘制蛇头（仅一个 @）
  mvprintw(snake[0].y, snake[0].x, "@");
  attroff(COLOR_PAIR(2));

  // 绘制食物
  attron(COLOR_PAIR(3));
  mvprintw(foodY, foodX, "O");
  attroff(COLOR_PAIR(3));

  scoreandtips(); // 更新提示
  refresh();
}

// 键盘控制蛇方向（支持长按 r 和 s）
void keyboardControl(int ch)
{
  static bool last_r_pressed = false;
  static bool last_s_pressed = false;

  if (ch == ERR)
  {
    // 保持长按状态
    if (r_pressed)
      speedup();
    if (s_pressed)
      speeddown();
    return;
  }

  // 处理按键按下
  switch (ch)
  {
  case 2: // Ctrl+B (^b)
    ctrl_b_pressed = true;
    break;
  case 5: // Ctrl+E (^e)
    ctrl_e_pressed = true;
    ctrl_b_pressed = false;
    r_pressed = false;
    s_pressed = false;
    s_key_down = false;
    resetSpeed();
    break;
  case 's':
  case 'S':
    if (!last_s_pressed)
    {
      s_key_down = true;
      s_pressed = true;
      r_pressed = false;
      ctrl_e_pressed = false;
      speeddown();
      last_s_pressed = true;
    }
    break;
  case 'r':
  case 'R':
    if (!last_r_pressed)
    {
      if (ctrl_b_pressed)
      {
        r_pressed = true;
        s_pressed = false;
        s_key_down = false;
        ctrl_e_pressed = false;
        speedup();
        last_r_pressed = true;
      }
      else
      {
        r_pressed = true;
        s_pressed = false;
        s_key_down = false;
        ctrl_e_pressed = false;
        speedup();
        last_r_pressed = true;
      }
    }
    break;
  case KEY_UP:
    if (direction != KEY_DOWN)
    {
      direction = KEY_UP;
      isMoving = true; // 方向键启动移动
    }
    break;
  case KEY_DOWN:
    if (direction != KEY_UP)
    {
      direction = KEY_DOWN;
      isMoving = true; // 方向键启动移动
    }
    break;
  case KEY_LEFT:
    if (direction != KEY_RIGHT)
    {
      direction = KEY_LEFT;
      isMoving = true; // 方向键启动移动
    }
    break;
  case KEY_RIGHT:
    if (direction != KEY_LEFT)
    {
      direction = KEY_RIGHT;
      isMoving = true; // 方向键启动移动
    }
    break;
  case 27: // ESC 键
    break; // 由 welcometogame() 处理
  }

  // 检测按键释放（模拟）
  if (ch != 'r' && ch != 'R')
    last_r_pressed = false;
  if (ch != 's' && ch != 'S')
    last_s_pressed = false;
  if (!last_r_pressed)
    r_pressed = false;
  if (!last_s_pressed)
  {
    s_pressed = false;
    s_key_down = false;
  }
}